<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <!-- 什么是 面向对象
    面向对象是一种编程思想，因为我们编程就是把日常生活中的东西在代码中体现，面向对象的意思就是把一个事物 看作一个对象，用属性和方法描述这个对象 -->
    <script>
        // es5面向对象的语法
        // es5中构造函数 能够构建对象
        // 构造函数和普通函数的区别
        // 调用用new调用
        // this指向实例化对象
        // 构造函数一般首字母大写

        function People(n, a) {
            this.name = n;
            this.age = a;
            this.names = "好人";
        }
        People.prototype.type = "人类";
        People.prototype.say = function() {
            alert("人会说话");
        };

        let xiaomai = new People("小麦", 20);
        let xiaoli = new People("小丽", 18);
        xiaoli.say();
        console.log(People.prototype);
        console.log(xiaomai.__proto__);

        // 1. 构造函数有显式原型 里面放的是构造函数的公共的属性和方法
        // 2.实例有隐式原型 指向该实例构造函数的显示原型
        // 3.每一个原型里有一个constructor 指向 就是构造函数本身

        // 4原型链
        // 获取对象属性或者方法的时候， 如果对象本身没有这个属性， 那就会去他的原型\ _ _proto_ _上去找， 如果还查不到， 就去找原型的原型， 一直找到最顶层(Object.prototype) 为止。 Object.prototype 对象也有_ _proto_\ _属性值为 null。

        function Man(n, a) {
            // People.call(this, n, a)
            People.apply(this, [n, a])
            this.face = "有胡子";
        }
        // Man.prototype.
        Man.prototype = new People();
        let xiaozhang = new Man("小张", 18);
        xiaozhang.say();
        alert(xiaozhang.name)

        //第一种继承可以继承父类的原型的方法和 构造函数里固定的属性
        //第二种继承 用call或者apply 这种继承只能 继承 构造函数里的属性 不能继承原型的
        // 所以要把两种结合用
    </script>
</body>

</html>

</html>